const PubBus={
  id:1,
  callbacks:{},
}
//订阅者，用id拉标识唯一的订阅者订阅的频道
PubBus.subscribe = function(chancel,callback){
  let token_ = "token_" +this.id++
  //检测是否有这个频道
  if(this.callbacks[chancel]){
    //用键值对存对应id的回调函数
    this.callbacks[chancel][token_] = callback
  }else{
    //没有的话创建这个频道，并且存入这个键值对
    this.callbacks[chancel] = {
      [token_]:callback
    }
  }
  return token_
}
//发布事件
PubBus.publish = function(chancel,data){
  //找到订阅该频道的订阅者，调用它的回调函数
  if(this.callbacks[chancel]){
    //因为订阅者是用键值对存储的，所以我们要对它的值value(key(订阅者的id)---values(回调函数))进行遍历
    Object.values(this.callbacks[chancel]).forEach(callback =>{
      callback(data)
    })
  }
  
}
//取消频道
PubBus.off = function(flag){
  //取消订阅者
  //取消频道
  //取消整个
  if(flag === undefined){
    this.callbacks = {}
  }else if(typeof flag === 'string'){
    if(flag.indexOf('token_')===0){
      //遍历频道所有的value
     let callbackObj = Object.values(this.callbacks).find(obj=>
       obj.hasOwnProperty(flag))
     console.log(callbackObj)
     //有存在id的频道，直接删除找到的频道的键值对(id-callback)
     if(callbackObj){
       delete callbackObj[flag]
     }
    }else{
      //删除频道
      delete this.callbacks[flag]
    }
  }
}